home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Utilities / BenchMarks / ByteBenchmark / src / context1.c < prev    next >
C/C++ Source or Header  |  1994-01-27  |  3KB  |  109 lines

  1.  
  2. /*******************************************************************************
  3.  *  The BYTE UNIX Benchmarks - Release 3
  4.  *          Module: context1.c   SID: 3.3 5/15/91 19:30:18
  5.  *          
  6.  *******************************************************************************
  7.  * Bug reports, patches, comments, suggestions should be sent to:
  8.  *
  9.  *    Ben Smith, Rick Grehan or Tom Yager
  10.  *    ben@bytepb.byte.com   rick_g@bytepb.byte.com   tyager@bytepb.byte.com
  11.  *
  12.  *******************************************************************************
  13.  *  Modification Log:
  14.  *  $Header: context1.c,v 3.4 87/06/22 14:22:59 kjmcdonell Beta $
  15.  *  August 28, 1990 - changed timing routines--now returns total number of
  16.  *                    iterations in specified time period
  17.  *
  18.  ******************************************************************************/
  19. char SCCSid[] = "@(#) @(#)context1.c:3.3 -- 5/15/91 19:30:18";
  20. /*
  21.  *  Context switching via synchronized unbuffered pipe i/o
  22.  *
  23.  */
  24.  
  25. #include <stdio.h>
  26. #include "timeit.c"
  27. #include <errno.h>
  28.  
  29. unsigned long iter;
  30.  
  31. report()
  32. {
  33.     fprintf(stderr,"%ld loops\n", iter);
  34.     exit(0);
  35. }
  36.  
  37. main(argc, argv)
  38. int    argc;
  39. char    *argv[];
  40. {
  41.     int duration;
  42.     int    check;
  43.     int    p1[2], p2[2];
  44.  
  45.     if (argc != 2) {
  46.         printf("Usage: context duration\n");
  47.         exit(1);
  48.     }
  49.  
  50.     duration = atoi(argv[1]);
  51.     
  52.     /* set up alarm call */
  53.     iter = 0;
  54.     wake_me(duration, report);
  55.  
  56.     if (pipe(p1) || pipe(p2)) {
  57.         perror("pipe create failed");
  58.         exit(1);
  59.     }
  60.  
  61.     if (fork()) {    /* parent process */
  62.         /* master, write p1 & read p2 */
  63.         close(p1[0]); close(p2[1]);
  64.         while (1) {
  65.             if (write(p1[1], (char *)&iter, sizeof(iter)) != sizeof(iter)) {
  66.                 if ((errno != 0) && (errno != EINTR))
  67.                     perror("master write failed");
  68.                 exit(1);
  69.             }
  70.             if (read(p2[0], (char *)&check, sizeof(check)) != sizeof(check)) {
  71.                 if ((errno != 0) && (errno != EINTR))
  72.                     perror("master read failed");
  73.                 exit(1);
  74.             }
  75.             if (check != iter) {
  76.                 printf("Master sync error: expect %d, got %d\n",
  77.                     iter, check);
  78.                 exit(2);
  79.             }
  80.             iter++;
  81.         }
  82.     }
  83.     else { /* child process */
  84.         unsigned long iter1;
  85.  
  86.         iter1 = 0;
  87.         /* slave, read p1 & write p2 */
  88.         close(p1[1]); close(p2[0]);
  89.         while (1) {
  90.             if (read(p1[0], (char *)&check, sizeof(check)) != sizeof(check)) {
  91.                 if ((errno != 0) && (errno != EINTR))
  92.                     perror("slave read failed");
  93.                 exit(1);
  94.             }
  95.             if (check != iter1) {
  96.                 printf("Slave sync error: expect %d, got %d\n",
  97.                     iter, check);
  98.                 exit(2);
  99.             }
  100.             if (write(p2[1], (char *)&iter1, sizeof(iter1)) != sizeof(check)) {
  101.                 if ((errno != 0) && (errno != EINTR))
  102.                     perror("slave write failed");
  103.                 exit(1);
  104.             }
  105.             iter1++;
  106.         }
  107.     }
  108. }
  109.